package com.xxzb.pack0823.线程同步.互斥同步;

public class PrintStr {

    private String str;
    public PrintStr(String str){
        this.str = str;
    }

    private static final Object LOCK = new Object();

    private  int index = 0;

    public int size(){
        return str.length();
    }

    /**
     * 同步锁不是给对象加锁，而是给操作共享资源的那段代码加锁
     * 加锁后，这段代码就不可分割，该段代码没有结束前，锁不解开，其他线程无法调用该方法
     * synchronized是Java的一个关键字用于实现线程同步
     * synchronized在方法中使用，表示该方法为一个同步方法
     * 在同步操作中必须存在一个锁对象,要求锁对应可以是任意对象，但必须唯一
     * 如果为同步方法则锁对象是当前类的对象
     * 同步方法的同步锁为this，此时必须保证this是唯一的
     * 同步静态方法的锁对象是类.class,一个类只有一个class对象
     * 如果this不唯一也不使用静态同步方法则需要使用同步代码块，自定义同步锁唯一即可
     */
    public   void printStr(){
        synchronized(this){//同步代码块可以自定义锁
            if (index < str.length()) {
                char c = str.charAt(index);
                System.out.println(Thread.currentThread().getName() + ":" + c);

                try {
                    Thread.sleep(100);//线程休眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                index++;
            } else {
                System.out.println("字符输出结束!");
            }
        }
    }
}